<?php
namespace Community\Controller;
use Message\Controller\IndexController;
use Think\Controller;

//require_once "./ThinkPHP/Library/Vendor/Alipay/Corefunction.php";
//require_once "./ThinkPHP/Library/Vendor/Alipay/Md5function.php";

class AlipayController extends Controller {
    public function _initialize(){
        header('Access-Control-Allow-Origin:*');
        header('Access-Control-Allow-Methods:GET');
        header('Access-Control-Allow-Methods:POST');
        header('Access-Control-Allow-Headers:x-requested-with,content-type');
        vendor('Alipay.Notify');
    }

    // 签名生成订单信息
    public function rsaSign($data) {
        $priKey = "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCmht4XN6ZZbv3QnU8+KGPJZfGMfn8D6cWPHH865/cxcWYHy7eJ
a90VOB1S/kTrOke0832t68ehr0spPDsxl/5WjGzHtypOtu/6/iaBRPmHd3oc3qdA
R6AdrFG06IBQv2r4Ap9MhtB2CztRpwIX+7iKqKbxhKfAIfrIWoFg6HmFywIDAQAB
AoGBAJeUD7hGeW7SrsojRqwni50Y5COkSO1A7wjzQYRW/RTOSbcy4Z9+xUC5UUfo
FseexwKY2H9lLNOpgdrI7oCX/3NDxPlUcuB8T74uwtBGd86ckImOMWf8CImpjQvH
WD3ARYYvr3Cljjx1U3QsKFsAWdylGvwPxlUVocLQKs7tqJNxAkEA28wBuG0PM1ay
j13r/Jd2zzZar5PZhdRLepyoRAKlbJEiI6F+tPZLW9P//LMAhpbmEkQmVlZ/N2QE
MEAZ9tYdvQJBAMH0qnSL12HQ1mP7Z/xUjRKGE9irF/F9G/jGN8ln0jxo8YulKu45
JyALhOxv96wb+4kyGSlHD+QzHiOfQR9r1icCQDbpV8CwlmyYC1If/9YCLS+Ff9B/
moeByz2dp7geBSADfkjyjso9AgS2CS0jt0zopCAKIJ3PTEcVWKqJSTNOuO0CQFj3
DhzJbDD85uoTjn4Klm7xuza+PAxT87mnyj0C90coZ+tDBq8g3hZv0jfVoAh9CWLD
7RCm/N4SqHd0fB2ajC8CQCE0N359CqDy8upm1za0eyXTq9YqdKGNJ5R9MCObWSkj
d6j0IXCxhAeswk0awwOUMNad+m0ucQdEvnnCaa1BaLM=
-----END RSA PRIVATE KEY-----";
        $res = openssl_get_privatekey($priKey);
        openssl_sign($data, $sign, $res);
        openssl_free_key($res);
        $sign = base64_encode($sign);
        $sign = urlencode($sign);
        return $sign;
    }

//    public function test(){
//        $data=array(
//            'a'=>'123'
//        );
//        $result=$this->createLinkstring($data);
//        $info=$this->rsaSign($result);
//        echo $info;
//    }

    // 对签名字符串转义
    public function createLinkstring($para) {
        $arg  = "";
        while (list ($key, $val) = each ($para)) {
            $arg.=$key.'="'.$val.'"&';
        }
        //去掉最后一个&字符
        $arg = substr($arg,0,count($arg)-2);
        //如果存在转义字符，那么去掉转义
        if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
        return $arg;
    }

    /**
     * @param $no //订单id
     * @param $name //收货人
     * @param $fee  //价格
     * @param $descrition   //订单描述
     */
    public function alipay($no,$name,$fee,$descrition){//$no,$name,$fee,$descrition
        header('Access-Control-Allow-Origin: *');
        header('Content-type: text/plain');

        $alipay_config=C('alipay_config');
        /**************************请求参数**************************/
        $payment_type = "1"; //支付类型 //必填，不能修改
        $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
        $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
        $seller_email = C('alipay.seller_email');//卖家支付宝帐户必填


        /*     $out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递，注意要唯一！
             $subject = $_POST['ordsubject'];  //订单名称 //必填 通过支付页面的表单进行传递
             $total_fee = $_POST['ordtotal_fee'];   //付款金额  //必填 通过支付页面的表单进行传递
             $body = $_POST['ordbody'];  //订单描述 通过支付页面的表单进行传递
             $show_url = $_POST['ordshow_url'];  //商品展示地址 通过支付页面的表单进行传递
             $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
             $exter_invoke_ip = get_client_ip(); //客户端的IP地址  */

        $out_trade_no = $no;//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject = $name;  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee =$fee;   //付款金额  //必填 通过支付页面的表单进行传递
        $body = $descrition;  //订单描述 通过支付页面的表单进行传递

//        $out_trade_no = 1103;//商户订单号 通过支付页面的表单进行传递，注意要唯一！
//        $subject = 1101;  //订单名称 //必填 通过支付页面的表单进行传递
//        $total_fee =0.01;   //付款金额  //必填 通过支付页面的表单进行传递
//        $body = 1101;  //订单描述 通过支付页面的表单进行传递


        $show_url = 'http://api.chinaola.net/ola/';  //商品展示地址 通过支付页面的表单进行传递
        $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址

        $parameter = array(
            'service'        => 'mobile.securitypay.pay',   // 必填，接口名称，固定值
            'partner'        => trim($alipay_config['partner']),                   // 必填，合作商户号
            '_input_charset' => trim(strtolower($alipay_config['input_charset'])),                 // 必填，参数编码字符集
            'out_trade_no'   => $out_trade_no,              // 必填，商户网站唯一订单号
            'subject'        => $subject,                   // 必填，商品名称
            'payment_type'   => $payment_type,                      // 必填，支付类型
            "seller_id"    => $seller_email,                // 必填，卖家支付宝账号
            "total_fee"    => $total_fee,                // 必填，总金额，取值范围为[0.01,100000000.00]
            'body'           => $body,                      // 必填，商品详情
            'it_b_pay'       => '1d',                       // 可选，未付款交易的超时时间
            'notify_url'     => urlencode($notify_url),                // 可选，服务器异步通知页面路径
            "show_url"    => urlencode($show_url),
            "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
        );
//生成需要签名的订单
        $orderInfo = $this->createLinkstring($parameter);

//签名
        $sign = $this->rsaSign($orderInfo);
//生成订单
        $this->ajaxReturn(['order'=>$orderInfo.'&sign="'.$sign.'"&sign_type="RSA"']);
//        echo json_encode(['order'=>$orderInfo.'&sign="'.$sign.'"&sign_type="RSA"'],JSON_UNESCAPED_UNICODE);
    }

    /**
     * 暂时处理订单接口
     * @param $ordid
     */
    public function paySuccessLater($ordid,$pid){
        if(!IS_AJAX) E('网页不存在');
        //验证秘钥
        if($pid != md5(date('YmdH',time()).md5('olapay'))){
            $this->ajaxReturn(['status'=>0]);
        }
        //获取该订单详情
        $order_info = M('client_book')->where(['ordid'=>$ordid])->find();
        $token = M('user')->where(['userid'=>$order_info['user_id']])->getField('token');
        //将订单改为2已付款
        $res = M('client_book')->where(['ordid'=>$ordid])->save(['ordstatus'=>2]);
        if($res){
            //订单付款成功后
            //添加消息到消息表里面
            $beserve_name = M('be_servepeople')->where(['id'=>$order_info['beserve_id']])->getField('name');
            $data = [
                'user_id'=>$order_info['user_id'],
                'flag'=>'B',//标识B为评论消息
                'pid'=>$order_info['id'],
                'create_time'=>time(),
                'remark'=>$ordid,
                'content'=>$beserve_name,//被护理人
            ];
            M('news')->add($data);
            //调用的系统消息推送
            $push = new IndexController();
            $push->sendPushMessage(md5(date('YmdH',time()).md5('ola')),'付款成功',$token);
            $this->ajaxReturn(['status'=>1]);
        }else{
            $this->ajaxReturn(['status'=>0]);
        }
    }
    
    /**
     * 支付成功
     * 异步通知页面
     */
    public function notifyurl(){
        file_put_contents('1.txt','13212');
//        $data['testtimes']=0;
//        M('retimes')->where(array('id'=>1))->save($data['testtimes']);
        /*
        同理去掉以下两句代码；
        */
        //require_once("alipay.config.php");
        //require_once("lib/alipay_notify.class.php");

        //这里还是通过C函数来读取配置项，赋值给$alipay_config
        $alipay_config=C('alipay_config');
        //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        if($verify_result) {
            //验证成功
            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
            $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
            $trade_no       = $_POST['trade_no'];          //支付宝交易号
            $trade_status   = $_POST['trade_status'];      //交易状态
            $total_fee      = $_POST['total_fee'];         //交易金额
            $notify_id      = $_POST['notify_id'];         //通知校验ID。
            $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
            $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号；
            $parameter = array(
                "out_trade_no"     => $out_trade_no, //商户订单编号；
                "trade_no"     => $trade_no,     //支付宝交易号；
                "total_fee"     => $total_fee,    //交易金额；
                "trade_status"     => $trade_status, //交易状态
                "notify_id"     => $notify_id,    //通知校验ID。
                "notify_time"   => $notify_time,  //通知的发送时间。
                "buyer_email"   => $buyer_email,  //买家支付宝帐号；
            );
            if($trade_status == 'TRADE_FINISHED') {
                //
            }else if ($trade_status == 'TRADE_SUCCESS') {
                if(!checkorderstatus($out_trade_no))
                {
                    file_put_contents('2.txt',$parameter);
                    orderhandle($parameter);
                    //进行订单处理，并传送从支付宝返回的参数；
                }
            }
            echo "success";        //请不要修改或删除
        }else {
            file_put_contents('3.txt','come in');
            //验证失败
            echo "fail";
        }
    }
}

